#ifndef _BASIC_BOARD_H_
#define _BASIC_BOARD_H_

#include "led_board.h"
#include "motor_board.h"
#include "sensor_board.h"

#define BASIC_MESSAGE_CARRYING_DATA_LENGTH          (5ul) // 消息携带数据长度

// 电机任务
typedef void (*BasicMotorTask_t)(void);
// 错误指示灯任务
typedef void (*BasicErrorLedTask_t)(void);
// 事件指示灯任务
typedef void (*BasicEventLedTask_t)(void);

/**
 * @brief 基本消息
 *
 */
typedef struct
{
  uint8_t Type;                                     // 类型
  uint8_t Data[BASIC_MESSAGE_CARRYING_DATA_LENGTH]; // 数据
} BasicMessagePacket_t;

/**
 * @brief 事件类型
 *
 */
typedef enum
{
  BASIC_MOTOR_LISTER     = 1 << 0, // 电机
  BASIC_EVENT_LED_LISTER = 1 << 1, // 事件指示灯
  BASIC_ALARM_LED_LISTER = 1 << 2, // 错误指示灯
} BasicTypeOfEvent_t;

/**
 * @brief 外部接口
 *
 */
typedef struct
{
  BasicMotorTask_t MotorTaskCallback;       // 电机任务回调
  BasicEventLedTask_t EventLedTaskCallback; // 事件指示灯任务回调
  BasicErrorLedTask_t ErrorLedTaskCallback; // 错误指示灯任务回调
} BasicExternalInterfaces_t;

/**
 * @brief 毫秒延时
 *
 */
extern void BasicDelayMs(uint32_t Ms);

/**
 * @brief 获取外部验证使能位
 *
 * @return bool - 使能标志（true：使能 false：失能）
 */
extern bool BasicGetExternalValidationFunctionEnableBit(void);

/**
 * @brief 获取电机驱动时间
 *
 * @return uint16_t - 驱动时间
 */
extern uint16_t BasicGetMoTorDriveTime(void);

/**
 * @brief 获取开锁保持时间
 *
 * @note 毫秒为单位
 * @return uint16_t - 保持时间
 */
extern uint16_t BasicGetUnlockHoldTime(void);

/**
 * @brief 获取设备激活状态
 *
 * @return bool - 激活状态（true：激活 false: 未激活）
 */
extern bool BasicGetDeviceActivationStatus(void);

/**
 * @brief 获取钥匙重置使能标识
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool BasicGetTheKeyToResetEn(void);

/**
 * @brief 获取撬锁检测间隔
 *
 * @return uint8_t - 撬锁检测间隔
 */
extern uint8_t BasicGetAntiSkidDetetionInterval(void);

/**
 * @brief 获取反锁提示间隔
 *
 * @return uint8_t - 反锁提示间隔
 */
extern uint8_t BasicGetLockedInReminderInterval(void);

/**
 * @brief 获取假锁检测间隔
 *
 * @return uint8_t - 假锁检测间隔
 */
extern uint8_t BasicGetFalseLockDetcetionInterval(void);

/**
 * @brief 获取常开提示间隔
 *
 * @return uint8_t - 常开提示间隔
 */
extern uint8_t BasicGetNormalOpenReminderInterval(void);

/**
 * @brief 获取防撬报警使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool BasicGetAntiSkidDetetionAlarmEn(void);

/**
 * @brief 获取门虚位警报使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool BasicGetDoorLeftAjarAlarmEn(void);

/**
 * @brief 获取反锁警报使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool BasicGetLockedInSignalOutputEn(void);

/**
 * @brief 获取自检使能标志
 *
 * @return bool - 使能标志（true：使能 false：失能）
 */
extern bool BasicGetSelfTestFlagBit(void);

/**
 * @brief 判断是否处于网络附着状态
 *
 * @return bool - 是否处于网络附着状态（true：是 false：否）
 */
extern bool BasicDetermineWhetherTheNetworkIsAttached(void);

/**
 * @brief 获取剩余电量百分比
 *
 * @return uint8_t - 剩余电量百分比
 */
extern uint8_t BasicGetRemainingBatteryPercentage(void);

/**
 * @brief 执行恢复出厂设置
 *
 * @return bool - 执行结果（true：成功 false：失败）
 */
extern bool BasicExecuteFactorySetting(void);

/**
 * @brief 斜舌复位
 *
 */
extern void BasicBeveledLatchReset(void);

/**
 * @brief 防撬开关恢复默认状态
 *
 */
extern void BasicAntiSkidReturnedToDefaultState(void);

/**
 * @brief 撬锁警报触发
 *
 */
extern void BasicAntiSkidTiggerAlarmState(void);

/**
 * @brief 钥匙拔出
 *
 */
extern void BasicKeyRemove(void);

/**
 * @brief 钥匙插入
 *
 */
extern void BasicKeyInsert(void);

/**
 * @brief 反锁触发
 *
 */
extern void BasicLockedInTigger(void);

/**
 * @brief 反锁恢复
 *
 */
extern void BasicLockInRecovery(void);

/**
 * @brief 获取是否存在开锁动作
 * 
 * @return bool - 是否存在开锁动作（true：存在 false：不存在）
 */
extern bool BasicGetUnlockTaskIsAction(void);

/**
 * @brief 假锁恢复
 *
 */
extern void BasicFalseReturnedToDefaultState(void);

/**
 * @brief 假锁触发
 *
 */
extern void BasicFalseTiggerAlarmState(void);

/**
 * @brief 播放锁打开音频
 *
 */
extern void BasicPlayUnlockingAudio(void);

/**
 * @brief 播放打开常开模式音频
 *
 */
extern void BasicPlayNormalOpenAudio(void);

/**
 * @brief 播放设备处于初始化状态音效
 *
 */
extern void BasicPlayDeviceInTheInitializedStateAudio(void);

/**
 * @brief 播放低电压音效
 *
 */
extern void BasicPlayLowBatteryAudio(void);

/**
 * @brief 写钥匙插入状态日志
 *
 * @param TiggerEn - 触发状态（true：触发 false：静默）
 */
extern void BasicWriteKeyedInTiggerStatusLogFile(bool TiggerEn);

/**
 * @brief 写防撬警报触发状态
 *
 * @param TiggerEn - 触发状态（true：触发 false：静默）
 */
extern void BasicWriteAutiPickAlarmTiggerStatusLogFile(bool TiggerEn);

/**
 * @brief 写假锁警报触发状态
 *
 * @param TiggerEn - 触发状态（true：触发 false：静默）
 */
extern void BasicWriteFalseLockAlarmTiggerStatusLogFile(bool TiggerEn);

/**
 * @brief 写反锁触发状态
 *
 * @param TiggerEn - 触发状态（true：触发 false：静默）
 */
extern void BasicWriteDoubleLockTiggerStatusLogFile(bool TiggerEn);

/**
 * @brief 写开锁日志
 *
 * @param TiggerEn - 触发标识
 */
extern void BasicWriteDoorUnlockLogFile(bool TiggerEn);

/**
 * @brief 停止电机任务
 *
 */
extern void BasicStopMotorTask(void);

/**
 * @brief 延时启动电机任务
 *
 * @param DelayMs - 延时时间
 */
extern void BasicDelayedStartMotorTask(uint32_t DelayMs);

/**
 * @brief 立即启动电机任务
 *
 */
extern void BasicStartMotorTaskNoWait(void);

/**
 * @brief 停止事件指示灯任务
 *
 */
extern void BasicStopEventLedTask(void);

/**
 * @brief 延时启动事件指示灯任务
 *
 * @param DelayMs - 延时时间
 */
extern void BasicDelayedStartEventLedTask(uint32_t DelayMs);

/**
 * @brief 立即启动事件指示灯任务
 *
 */
extern void BasicStartEventLedTaskNoWait(void);

/**
 * @brief 停止错误指示灯任务
 *
 */
extern void BasicStopAlarmLedTask(void);

/**
 * @brief 延时启动错误指示灯任务
 *
 * @param DelayMs - 延时时间
 */
extern void BasicDelayedStartAlarmLedTask(uint32_t DelayMs);

/**
 * @brief 立即启动错误指示灯任务
 *
 */
extern void BasicStartAlarmLedTaskNoWait(void);

/**
 * @brief 初始化管脚相关功能
 *
 * @param pExternalInterfacesIn - 外部调用方法
 */
extern void BasicBoardInitialisation(BasicExternalInterfaces_t *pExternalInterfacesIn);

#endif
